package com.yzqp.generator.util;

import org.springframework.util.StringUtils;

/**
 * 驼峰命名工具类
 *
 * @author hejiacheng
 * @date 2021-12-11
 */
public class HumpNameUtil {

    /**
     * 驼峰命名
     *
     * @param str
     * @return
     */
    private static String getHumpName(String str) {
        // 转成字符数组
        char[] cs = str.toCharArray();
        // 把下划线的下一个下标转换成大写字母
        // 下划线的数量
        int underLineCount = 0;
        for (int i = 0; i < cs.length; i++) {
            char c = cs[i];
            // 判断是否等于 _
            if ("_".equals(c + "")) {
                // 是否还有下一个元素
                if (i + 1 < cs.length) {
                    char nextChar = cs[i + 1];
                    // 判断是否是小写
                    if (nextChar >= 'a' && nextChar <= 'z') {
                        // 变成大写
                        nextChar = (char) (nextChar - 32);
                        cs[i + 1] = nextChar;
                    }
                }
                // 下划线 + 1
                underLineCount++;
            }
        }
        // 转成字符数组
        char[] newCs = new char[cs.length - underLineCount];
        // 新数组下标
        int newCsIndex = 0;
        // 把下划线的下一个下标转换成大写字母
        for (int i = 0; i < cs.length; i++) {
            char c = cs[i];
            // 判断是否等于 _
            if (!"_".equals(c + "")) {
                newCs[newCsIndex] = c;
                newCsIndex++;
            }
        }
        return new String(newCs);
    }

    /**
     * 去掉前缀
     *
     * @param tableName 例如sys_goods_info
     * @return
     */
    private static String removeTablePrefix(String tableName) {
        // 转成字符数组
        char[] cs = tableName.toCharArray();
        // 把下划线的下一个下标转换成大写字母
        // 下划线的数量
        int oneUnderLineIndex = 0;
        for (int i = 0; i < cs.length; i++) {
            char c = cs[i];
            // 判断是否等于 _
            if ("_".equals(c + "")) {
                oneUnderLineIndex = i;
                break;
            }
        }
        return new String(cs, oneUnderLineIndex + 1, cs.length - (oneUnderLineIndex + 1));
    }

    /**
     * 首字母大写
     *
     * @param str 例如goodsInfo
     * @return
     */
    private static String getFirstCharToCase(String str) {
        if(StringUtils.isEmpty(str)){
            return str;
        }
        // 转成字符数组
        char[] cs = str.toCharArray();
        // 把下划线的下一个下标转换成大写字母
        char firstChar = cs[0];
        if (firstChar >= 'a' && firstChar <= 'z') {
            // 变成大写
            firstChar = (char) (firstChar - 32);
            cs[0] = firstChar;
        }
        return new String(cs);
    }

    /**
     * 获得java类的驼峰命名
     *
     * @param tableName 例如sys_goods_info
     * @return
     */
    public static String getJavaClassName(String tableName) {
        // 去掉前缀
        tableName = HumpNameUtil.removeTablePrefix(tableName);
        // 获得驼峰
        tableName = HumpNameUtil.getHumpName(tableName);
        // 首字母大写
        tableName = HumpNameUtil.getFirstCharToCase(tableName);
        return tableName;
    }

    /**
     * 获得java类的驼峰命名
     *
     * @param tableName     例如sys_goods_info
     * @param postfixString 后缀 例如 dao, bean,service
     * @return
     */
    public static String getJavaClassName(String tableName, String postfixString) {
        tableName = HumpNameUtil.getJavaClassName(tableName);
        // 后缀首字母大写
        tableName = tableName + HumpNameUtil.getFirstCharToCase(postfixString);
        return tableName;
    }

    /**
     * 获得java 字段 的驼峰命名
     *
     * @param colomnName 例如 goods_name
     * @return
     */
    public static String getJavaFieldName(String colomnName) {
        // 获得驼峰命名
        colomnName = HumpNameUtil.getHumpName(colomnName);
        return colomnName;
    }

    /**
     * 获得java类的驼峰命名
     *
     * @param tableName 例如sys_goods_info 返回goodsInfo
     * @return
     */
    public static String getControllerPath(String tableName) {
        // 去掉前缀
        tableName = HumpNameUtil.removeTablePrefix(tableName);
        // 获得驼峰
        tableName = HumpNameUtil.getHumpName(tableName);
        return tableName;
    }


    public static void main(String[] args) {
        String res = HumpNameUtil.getJavaClassName("sys_goods_info");
        String res1 = HumpNameUtil.getJavaFieldName("goods_name");
        System.out.println(res1);
    }
}
